from qtpy import QtCore
# 从 docutils 库导入 core 模块，用于将 reStructuredText 转换为其他格式
from docutils import core
# 从 src 模块导入 GET_PACKAGES，不过该导入未使用，后续可移除
from src import GET_PACKAGES
# 从 src 核心公共模块导入所有内容
from src.Core.Common import *
# 从 src UI 样式表工具模块导入 Colors 类，用于管理颜色
from src.UI.Utils.stylesheet import Colors

# DEFAULT_WIDGET_VARIANT = "DefaultWidget"

def rst2html(rst):
    """
    将 reStructuredText 格式的文本转换为 HTML 格式。

    :param rst: 输入的 reStructuredText 文本
    :return: 转换后的 HTML 格式文本，如果输入为 None 则返回空字符串
    """
    if rst is not None:
        # 使用 docutils 的 core.publish_string 方法将 rst 转换为 HTML 字节流，并解码为 UTF-8 字符串
        return core.publish_string(rst, writer_name="html").decode("utf-8")
    return ""

class VisibilityPolicy(IntEnum):
    """
    定义可见性策略的枚举类，用于控制元素的显示状态。
    """
    AlwaysVisible = 1  # 始终可见
    AlwaysHidden = 2   # 始终隐藏
    Auto = 3           # 自动根据条件显示或隐藏

class CanvasState(IntEnum):
    """
    定义画布状态的枚举类，用于表示画布当前的工作状态。
    """
    DEFAULT = 0  # 默认状态
    COMMENT_OWNERSHIP_VALIDATION = 1  # 注释所有权验证状态

class CanvasManipulationMode(IntEnum):
    """
    定义画布操作模式的枚举类，用于表示用户对画布的操作类型。
    """
    NONE = 0  # 无操作
    SELECT = 1  # 选择操作
    PAN = 2  # 平移操作
    MOVE = 3  # 移动操作
    ZOOM = 4  # 缩放操作
    COPY = 5  # 复制操作

class Spacings:
    """
    定义画布中各种元素间距的类。
    """
    kPinSpacing = 4  # 引脚之间的间距
    kPinOffset = 12  # 引脚的偏移量
    kSplitterHandleWidth = 5  # 分割器手柄的宽度

def lineRectIntersection(l, r):
    """
    计算直线与矩形的交点。依次检查直线与矩形四条边的交点，返回第一个有界交点。

    :param l: 输入的直线对象
    :param r: 输入的矩形对象
    :return: 如果有有界交点，返回交点；否则返回 None
    """
    # 计算直线与矩形左边的交点
    it_left, impactLeft = l.intersect(QtCore.QLineF(r.topLeft(), r.bottomLeft()))
    if it_left == QtCore.QLineF.BoundedIntersection:
        return impactLeft
    # 计算直线与矩形上边的交点
    it_top, impactTop = l.intersect(QtCore.QLineF(r.topLeft(), r.topRight()))
    if it_top == QtCore.QLineF.BoundedIntersection:
        return impactTop
    # 计算直线与矩形下边的交点
    it_bottom, impactBottom = l.intersect(
        QtCore.QLineF(r.bottomLeft(), r.bottomRight())
    )
    if it_bottom == QtCore.QLineF.BoundedIntersection:
        return impactBottom
    # 计算直线与矩形右边的交点
    it_right, impactRight = l.intersect(QtCore.QLineF(r.topRight(), r.bottomRight()))
    if it_right == QtCore.QLineF.BoundedIntersection:
        return impactRight

# This function clears property view's layout.
# @param[in] layout QLayout class
def clearLayout(layout):
    """
    清空指定布局中的所有子项。如果子项是部件，则删除该部件；如果子项是布局，则递归清空该布局。

    :param layout: 要清空的布局对象
    """
    while layout.count():
        child = layout.takeAt(0)
        if child.widget() is not None:
            # 删除部件
            child.widget().deleteLater()
        elif child.layout() is not None:
            # 递归清空子布局
            clearLayout(child.layout())

def findItemIndex(graphicsLayout, item):
    """
    在图形布局中查找指定项的索引。

    :param graphicsLayout: 图形布局对象
    :param item: 要查找的项
    :return: 如果找到，返回项的索引；否则返回 -1
    """
    for i in range(graphicsLayout.count()):
        if item == graphicsLayout.itemAt(i).graphicsItem():
            return i
    return -1

@SingletonDecorator
class PinDefaults(object):
    """
    单例类，用于存储引脚的默认设置。
    """

    def __init__(self):
        """
        初始化 PinDefaults 实例，设置引脚的默认大小。
        """
        self.__pinSize = 6

    @property
    def PIN_SIZE(self):
        """
        获取引脚的默认大小。

        :return: 引脚的默认大小
        """
        return self.__pinSize

@SingletonDecorator
class NodeDefaults(object):
    """
    单例类，用于存储节点的默认设置。
    """

    def __init__(self):
        """
        初始化 NodeDefaults 实例，设置节点的各种默认属性。
        """
        self.__contentMargins = 5  # 节点内容的边距
        self.__layoutsSpacing = 5  # 节点内布局的间距
        self.__cornersRoundFactor = 4  # 节点边角的圆角系数
        self.__svgIconKey = "svgIcon"  # SVG 图标的键名
        self.__layer = 1000000  # 节点的 Z 层

    @property
    def Z_LAYER(self):
        """
        获取节点的 Z 层。

        :return: 节点的 Z 层
        """
        return self.__layer

    @property
    def SVG_ICON_KEY(self):
        """
        获取 SVG 图标的键名。

        :return: SVG 图标的键名
        """
        return self.__svgIconKey

    @property
    def PURE_NODE_HEAD_COLOR(self):
        """
        获取纯节点头部的颜色。

        :return: 纯节点头部的颜色
        """
        return Colors.NodeNameRectGreen

    @property
    def COMPUTING_NODE_HEAD_COLOR(self):
        """
        获取计算节点头部的颜色。

        :return: 计算节点头部的颜色
        """
        return Colors.Red

    @property
    def CALLABLE_NODE_HEAD_COLOR(self):
        """
        获取可调用节点头部的颜色。

        :return: 可调用节点头部的颜色
        """
        return Colors.NodeNameRectBlue

    @property
    def CONTENT_MARGINS(self):
        """
        获取节点内容的边距。

        :return: 节点内容的边距
        """
        return self.__contentMargins

    @property
    def LAYOUTS_SPACING(self):
        """
        获取节点内布局的间距。

        :return: 节点内布局的间距
        """
        return self.__layoutsSpacing

    @property
    def CORNERS_ROUND_FACTOR(self):
        """
        获取节点边角的圆角系数。

        :return: 节点边角的圆角系数
        """
        return self.__cornersRoundFactor

class NodeActionButtonInfo(object):
    """
    用于填充节点头部的按钮信息类，这些按钮代表节点菜单中的操作。

    参见 UINodeBase 类的构造函数和 postCrate 方法。
    """

    def __init__(self, defaultSvgIcon, actionButtonClass=None):
        """
        初始化 NodeActionButtonInfo 实例。

        :param defaultSvgIcon: 默认的 SVG 图标路径
        :param actionButtonClass: 动作按钮的类，默认为 None
        """
        super(NodeActionButtonInfo, self).__init__()
        self._defaultSvgIcon = defaultSvgIcon
        self._actionButtonClass = actionButtonClass

    def actionButtonClass(self):
        """
        获取动作按钮的类。

        :return: 动作按钮的类
        """
        return self._actionButtonClass

    def filePath(self):
        """
        获取默认 SVG 图标的文件路径。

        :return: 默认 SVG 图标的文件路径
        """
        return self._defaultSvgIcon

@SingletonDecorator
class SessionDescriptor(object):
    """
    单例类，用于描述会话信息。
    """
    def __init__(self):
        """
        初始化 SessionDescriptor 实例，设置软件名称为空字符串。
        """
        self.software = ""